package actions.clientes;

import java.util.List;

import services.cliente.ClienteService;
import util.GSonHelper;
import util.SearchOperator;
import actions.base.SecureAction;

import com.google.gson.Gson;

import dto.ClienteDTO;
import dto.SearchDTO;
import exceptions.CannotDeleteException;
import exceptions.CannotSaveException;

public class ClienteAction extends SecureAction {

	private static final long serialVersionUID = 1L;

	private ClienteService clienteService;
	
	private ClienteDTO clienteDTO;
	
	private String query;
	
	@Override
	public String execute() {
		return SUCCESS;
	}
	
	/**
	 * Agrega un nuevo cliente
	 * @return
	 */
	public String agregar() {
		
		// TODO hacer validaciones
		
		try {
			clienteService.save(clienteDTO);
		} catch (CannotSaveException e) {
			setOk("false");
			setMensaje("No se ha podido almacenar el cliente");
			return SUCCESS_AGREGAR;
		}
		setOk("true");
		setMensaje("El cliente se ha almacenado correctamente");
		return SUCCESS_AGREGAR;
	}
	
	/**
	 * Borra un cliente
	 * @return
	 */
	public String borrar() {
		
		// TODO hacer validacion sobre ID
		
		try {
			clienteService.delete(id);
		} catch (CannotDeleteException e) {
			setOk("false");
			setMensaje("El cliente no se ha podido eliminar");
			return SUCCESS_AGREGAR;
		}
		setOk("true");
		setMensaje("El cliente se ha eliminado correctamente");
		return SUCCESS_AGREGAR;
	}

	/**
	 * Obtiene una lista de todos los clientes
	 * @return	la lista
	 */
	public String getClientes() {

		List<ClienteDTO> clientes = clienteService.findAll();
		
		Gson gson = GSonHelper.getInstance();
		String clientesStr = gson.toJson(clientes);
		
		setLista(clientesStr);
		return SUCCESS_LISTADO;
	}
	
	/**
	 * Obtiene una lista de clientes para mostrar en un listado 'typeahead'
	 * @return	la lista json
	 */
	public String getClienteList() {
		
		SearchDTO searchDTO = new SearchDTO();
		searchDTO.addCriteria("nombre_apellido", getQuery(), SearchOperator.OR_LIKE);
		
		List<ClienteDTO> clientes = clienteService.search(searchDTO);
		
		Gson gson = GSonHelper.getInstance();
		String clientesStr = gson.toJson(clientes);
		
		setLista(clientesStr);
		return SUCCESS_LISTADO;
	}

	
	/**
	 * Obtiene un cliente
	 * @return el cliente
	 */
	public String getCliente() {
		
		// TODO validacion sobre ID
		
		ClienteDTO cliente = clienteService.findById(id);
		
		Gson gson = GSonHelper.getInstance();
		String clienteStr = gson.toJson(cliente);
		setLista(clienteStr);
		return SUCCESS_JSON;
	}

	
	/**
	 * Busca clientes
	 */
	public String buscar() {
		
		// TODO validacion sobre DTO
		
		SearchDTO searchDTO = new SearchDTO();
		searchDTO.addCriteria("nombre", clienteDTO.getNombre(), SearchOperator.LIKE);
		searchDTO.addCriteria("apellido", clienteDTO.getApellido(), SearchOperator.LIKE);
		searchDTO.addCriteria("dni", clienteDTO.getDni(), SearchOperator.LIKE);
		searchDTO.addCriteria("direccion", clienteDTO.getDireccion(), SearchOperator.LIKE);
		
		List<ClienteDTO> clientes = clienteService.search(searchDTO);
		
		Gson gson = GSonHelper.getInstance();
		String clientesStr = gson.toJson(clientes);
		
		setLista(clientesStr);
		return SUCCESS_LISTADO;
	}
	
	
	/**
	 * Getters & Setters
	 */
	public String getQuery() {
		return query;
	}

	public void setQuery(String query) {
		this.query = query;
	}
	
	public ClienteDTO getClienteDTO() {
		return clienteDTO;
	}

	public void setClienteDTO(ClienteDTO clienteDTO) {
		this.clienteDTO = clienteDTO;
	}

	public ClienteService getClienteService() {
		return clienteService;
	}

	public void setClienteService(ClienteService clienteService) {
		this.clienteService = clienteService;
	}

}
